#include <iostream>
#include <string>
#include <functional>
#include <vector>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <cstring>
// int main()
// {
//     if (fork() == 0)
//     {
//         sleep(1);
//         // int a = 10;
//         // a /= 0;

//         int *a = nullptr;
//         *a = 10;
//         exit(0);
//     }

//     int status = 0;
//     waitpid(-1, &status, 0);

//     printf("exit signal: %d, core dump: %d\n", status & 0x7F, (status >> 7) & 1);
//     return 0;
// }

// void handler(int signo)
// {
//     std::cout << "get a signo: " << signo << std::endl;
// }

// int main()
// {
//     std::cout << "我是进程: " << getpid() << std::endl;
//     signal(2, handler);
//     while (1)
//         ;
// }

// void handler(int signo)
// {
//     std::cout << "get a signo: " << signo << std::endl;
//     exit(0);
// }

// int main()
// {
//     signal(11, handler);
//     while (1)
//     {
//         int *a = nullptr;
//         sleep(1);
//         *a = 10;
//     }
// }

//.mykill
// void Usage(std::string proc)
// {
//     std::cout << "Usage: " << proc << " signumber processid" << std::endl;
// }

// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         Usage(argv[0]);
//         exit(1);
//     }

//     int signumber = std::stoi(argv[1]);
//     pid_t id = std::stoi(argv[2]);

//     int n = ::kill(id, signumber);
//     if (n < 0)
//     {
//         perror("kill");
//         exit(2);
//     }
//     exit(0);
// }

// int cnt = 0;

// void handler(int signo)
// {
//     sleep(1);
//     cnt++;
//     std::cout << "我收到了一个信号值: " << signo << std::endl;

//     if (cnt == 10)
//         exit(0);
//     alarm(1);
// }

// int main()
// {
//     signal(14, handler);
//     alarm(1);

//     while (1)
//         ;
// }

// void Handler(int signo)
// {
//     std::cout << "signo" << std::endl;
// }
// int main()
// {
//     // signal怎么不放在循环里面？
//     // signal：如果没有产生2或者3号信号呢？Handler不被调用！
//     for (int signo = 1; signo < 32; signo++)
//     {
//         signal(signo, Handler); // 默认终止 -> 执行自定义方法：Handler
//         std::cout << "自定义捕捉信号: " << signo << std::endl;
//     }
//     while (1)
//         ;
// }

// int number = 10;

// void die(int signumber)
// {
//     printf("get a sig : %d, count : %d\n", signumber, number);
//     exit(0);
// }

// int main()
// {
// signal(SIGALRM, die);
// alarm(10);
// // while (number > 6)
// // {
// //     number--;
// //     sleep(1);
// // }
// sleep(4);
// int n = alarm(0); // 0:取消闹钟
// std::cout << "n : " << n << std::endl;
// signal(SIGALRM, die);

// int cnt = 5;
// while (true)
// {
//     std::cout << "hahaha alive" << std::endl;
//     cnt--;
//     if (cnt <= 0)
//     {
//         abort();
//     }
// }

//}

// void handler(int signo)
// {
//     std::cout << signo << std::endl;
//     exit(0);
// }

// int main()
// {
//     sleep(1);
//     signal(2, handler);
//     // 使用 raise 函数发送 2 信号给自己（当前进程）
//     raise(2);
// }

using func_t = std::function<void()>;

int gcount = 0;
std::vector<func_t> gfuncs;

// 把信号 更换 成为 硬件中断
void hanlder(int signo)
{
    for (auto &f : gfuncs)
    {
        f();
    }
    std::cout << "gcount : " << gcount << std::endl;
    alarm(1);
}

int main()
{
    gfuncs.push_back([]()
                     { std::cout << "我是一个内核刷新操作" << std::endl; });

    gfuncs.push_back([]()
                     { std::cout << "我是一个检测进程时间片的操作，如果时间片到了，我会切换进程" << std::endl; });

    gfuncs.push_back([]()
                     { std::cout << "我是一个内存管理操作，定期清理操作系统内部的内存碎片" << std::endl; });

    alarm(1); // 一次性的闹钟，超时alarm会自动被取消
    signal(SIGALRM, hanlder);

    while (true)
    {
        pause();
        std::cout << "我醒来了..." << std::endl;
        gcount++;
        if (gcount == 5)
            exit(0);
    }
}